package meta

import (
	"sort"
	"yunpan/db"
)

// FileMeta 文件元信息结构
type FileMeta struct {
	FileSha1 string
	FileName string
	FileSize int64
	Location string
	UploadAt string
	ReferenceCount  int64      // 默认引用计数为1
	IsOriginal bool
}

// ConvertDBFileToFileMeta 将数据库文件对象转换为FileMeta对象
func ConvertDBFileToFileMeta(dbFile *db.File) FileMeta {
	return FileMeta{
		FileSha1: dbFile.FileHash,
		FileName: dbFile.FileName,
		FileSize: dbFile.FileSize,
		Location: dbFile.FileAddr,
		UploadAt: dbFile.CreateAt.Format("2006-01-02 15:04:05"),
	}
}

// UpdateFileMetaDB 新增/更新文件元信息到数据库
func UpdateFileMetaDB(fmeta FileMeta) bool {
	return db.OnFileUploadFinished(
		fmeta.FileSha1,
		fmeta.FileName,
		fmeta.FileSize,
		fmeta.Location,
	)
}

// GetFileMetaDB 从数据库获取文件元信息
func GetFileMetaDB(fileSha1 string) (*FileMeta, error) {
	tfile, err := db.GetFileMeta(fileSha1)
	if err != nil {
		return nil, err
	}
	
	fmeta := ConvertDBFileToFileMeta(tfile)
	return &fmeta, nil
}

// GetLastFileMetas 获取最近上传的一些文件元信息
func GetLastFileMetas(count int) ([]FileMeta, error) {
	dbFiles, err := db.GetFileMetaList(count)
	if err != nil {
		return nil, err
	}

	fmetas := make([]FileMeta, len(dbFiles))
	for i, dbFile := range dbFiles {
		fmetas[i] = ConvertDBFileToFileMeta(&dbFile)
	}

	sort.Sort(ByUploadTime(fmetas))
	return fmetas, nil
}

// RemoveFileMeta 删除元信息
func RemoveFileMeta(fileSha1 string) {
	db.DeleteFileMeta(fileSha1)
}

// ByUploadTime 按上传时间排序
type ByUploadTime []FileMeta

func (a ByUploadTime) Len() int {
	return len(a)
}

func (a ByUploadTime) Swap(i, j int) {
	a[i], a[j] = a[j], a[i]
}

func (a ByUploadTime) Less(i, j int) bool {
	return a[i].UploadAt > a[j].UploadAt
}